package com.sherlocky.learning.java11.stream;

import java.math.BigInteger;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Stream 是 Java 8 中的新特性，Java 9 开始对 Stream 增加了以下 4 个新方法。
 *
 * @author: zhangcx
 * @date: 2019/9/26 17:16
 */
public class StreamSample {
    public static void main(String[] args) {
        // 1) 增加单个参数构造方法，可为null
        System.out.println(Stream.ofNullable(null).count()); // 0

        // 2) 增加 takeWhile 和 dropWhile 方法
        // 从开始计算，当 n < 3 时就截止。
        System.out.println(Stream.of(1, 2, 3, 2, 1)
                .takeWhile(n -> n < 3)
                .collect(Collectors.toList())); // [1, 2]

        // 这个和上面的相反，一旦 n < 3 不成立就开始计算。
        System.out.println(Stream.of(1, 2, 3, 2, 1)
                .dropWhile(n -> n < 3)
                .collect(Collectors.toList())); // [3, 2, 1]


        /**
         * 3）{@link Stream#iterate(Object, UnaryOperator)}  方法
         * 就是指定一个常量seed，产生从seed到常量f（由UnaryOperator返回的值得到）的流。这是一个迭代的过程，返回有序无限连续Stream。
         *
         * 而JDK11中的重载方法{@link Stream#iterate(Object, Predicate, UnaryOperator)}，
         * 可以让你提供一个 Predicate (是否继续迭代的判断条件) 来指定什么时候结束迭代。
         */
        // JDK 8 中的API不带终止条件，会一致迭代下去
        // Stream.iterate(BigInteger.ONE, n -> n.add(BigInteger.ONE)).forEach(System.out::println);
        System.out.println("__________________________________");
        Stream.iterate(BigInteger.ONE, n -> {
            // 到9以后就终止
            return n.compareTo(BigInteger.TEN) < 0;
        }, n -> n.add(BigInteger.ONE)).forEach(System.out::println);
        System.out.println("__________________________________");
    }
}
